package br.org.group.android.net;

import java.util.Iterator;
import java.util.Properties;

import android.content.Context;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import br.org.group.android.app.FortuneProvider;
import br.org.group.android.app.FortuneVO;
import br.org.group.android.dao.FortunesDAO;
import br.org.group.android.dao.FortunesDbAdapter;

/**
 * Created by IntelliJ IDEA. User: abner Date: 1/13/11 Time: 7:29 PM
 */
public class FortuneProviderService implements FortuneProvider {

	private Context ctx;
	private FortunesDbAdapter fDbAdapter;
	private static FortunesDAO fdao;

	public FortuneVO updateFortune() {
		FortuneVO fortune = new FortuneVO();
		fdao = getFortuneFromWebService();

		// Insere a fortune no DB
		if (fdao != null) {
			if (!fDbAdapter.alreadyHasFortune(fdao)) {
				fDbAdapter.inserir(fdao);
			}
		}
		//Sorteia uma nova fortune para ser exibida
		fdao = fDbAdapter.retornaFortune();

		fortune.setAutor(fdao.getAutor());
		fortune.setMensagem(fdao.getMensagem());
		fortune.setId(fdao.getId());
		return fortune;

	}


	public FortuneVO getFortune(int id) {
		FortuneVO fortune = new FortuneVO();
		fdao = getFortuneFromWebService();

		// Insere a fortune no DB
		if (fdao != null) {
			if (!fDbAdapter.alreadyHasFortune(fdao)) {
				fDbAdapter.inserir(fdao);
			}
		}
		//Sorteia uma nova fortune para ser exibida
		fdao = fDbAdapter.getFortune(id);

		fortune.setAutor(fdao.getAutor());
		fortune.setMensagem(fdao.getMensagem());
		fortune.setId(fdao.getId());
		return fortune;

	}
	
	private FortunesDAO getFortuneFromWebService() {
		int id = 0;
		fdao = new FortunesDAO();

		if (!checkInternetConnection(ctx)) {
			return null;
		}

		// Se tiver internet, temos que verificar qual o id da maior fortune e
		// pedir ao web service que retorne uma maior.
		// O web service não sorteia, somente devolve uma fortune com "id + 1"
		id = fDbAdapter.getMaxId();

		// String da url
		String urlString = "http://fortunesweb.appspot.com/fortunesweb";

		// Parametros a serem enviados
		Properties parameters = new Properties();
		parameters.setProperty("id", String.valueOf(id));

		// Iterador
		Iterator i = parameters.keySet().iterator();
		// Contador
		int counter = 0;

		// Enquanto ainda existir parametros
		while (i.hasNext()) {

			// Nome
			String name = (String) i.next();
			// Valor
			String value = parameters.getProperty(name);

			// Adiciona com um conector (? ou &)
			// Separa a url por ?, e as variáveis com &
			urlString += (++counter == 1 ? "?" : "&") + name + "=" + value;

		}

		try {

			//FortuneParser parser = new FortuneParser(connection.getInputStream());
			// O Parser pode receber direto a URL do webservice
			FortuneParser parser = new FortuneParser(urlString);
			fdao.setId(parser.getId());
			fdao.setMensagem(parser.getMessage());
			fdao.setAutor(parser.getAuthor());
			//fdao.setCategoria(parser.getCategory());

		} catch (Exception e) {
			fdao = new FortunesDAO();
		}

		return fdao;

	}

	public FortuneProviderService(Context context) {
		this.ctx = context;
		fDbAdapter = new FortunesDbAdapter(ctx);
	}

	public static boolean checkInternetConnection(Context ctx) {

		ConnectivityManager connec = (ConnectivityManager) ctx
				.getSystemService(Context.CONNECTIVITY_SERVICE);

		if (connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTED
				|| connec.getNetworkInfo(0).getState() == NetworkInfo.State.CONNECTING
				|| connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTING
				|| connec.getNetworkInfo(1).getState() == NetworkInfo.State.CONNECTED) {

			return true;

		} else if (connec.getNetworkInfo(0).getState() == NetworkInfo.State.DISCONNECTED
				|| connec.getNetworkInfo(1).getState() == NetworkInfo.State.DISCONNECTED) {
			return false;

		}

		return false;
	}

}
